package com.gsocket.event.check;

/**
 * 装饰着
 *
 * @author sakura
 * @since 2024/03/05
 */
public abstract class CheckDecorator implements ReveCheck {


    public ReveCheck check;


    /**
     * 发送的消息
     */
    public byte[] sendMsg;


    /**
     * 切割后接收到的消息
     */
    public byte[] recvMsg;

    // 功能码
    public Byte functionCode;


    // 功能码位置
    public int functionCodeIndex = 0;

    public CheckDecorator(ReveCheck check) {
        this.check = check;
    }

    @Override
    public boolean check(byte[] msg) {
        byte[][] ms = getMsg(msg);
        if (ms == null || ms.length == 0) {
            return false;
        }
        // 验证功能码
        if (!checkFunCode(msg)) {
            return false;
        }
        if (this.check != null) {
            for (byte[] m : ms) {
                if (this.check.check(m)) {
                    return true;
                }
            }
            return false;
        } else {
            this.recvMsg = msg;
            return true;
        }
    }

    @Override
    public byte[] getData(byte[] msg) {
        if (this.check != null) {
            return this.check.getData(msg);
        } else {
            return msg;
        }
    }

    @Override
    public byte[][] getMsg(byte[] msg) {
        if (this.check != null) {
            return this.check.getMsg(msg);
        } else {
            return new byte[][]{msg};
        }
    }


    public static int bytes2int(byte[] b) {
        int r = 0;
        for (byte value : b) {
            r = (r << 8) | (value & 0xff);
        }
        if ((b[0] & 0x80) == 0x80) {
            r = ~r;
            return (r + 1) * -1;
        }
        return r;
    }

    @Override
    public boolean checkFunCode(byte[] msg) {
        return true;
    }
}
